/**
 * 清除会话数据，包括所有的Cookie、sessionStorage和localStorage。
 *
 * 该函数首先获取所有的Cookie键，然后将每个Cookie的值设置为0，并设置其过期时间为过去的时间，
 * 以达到删除Cookie的效果。接着，清除浏览器的sessionStorage和localStorage。
 */
function clearSession() {
  // 使用正则表达式匹配所有的Cookie键
  const keys = document.cookie.match(/[^ =;]+(?=\=)/g)

  // 如果匹配到了Cookie键
  if (keys) {
    // 从后向前遍历所有的Cookie键
    for (let i = keys.length; i--; )
      // 将每个Cookie的值设置为0，并设置其过期时间为过去的时间，从而删除Cookie
      document.cookie = keys[i] + '=0;expires=' + new Date(0).toUTCString()
  }

  // 清除sessionStorage
  sessionStorage.clear()

  // 清除localStorage
  localStorage.clear()
}

/**
 * 处理单点登录（SSO）的函数
 * @param {string} SSOtype - 单点登录的类型
 * @returns {string} - 返回拼接的URL字符串，包含主机名、SSO类型和当前页面的原始URL编码后的服务参数
 */
export function handleSSO(SSOtype: string): string {
  // 根据当前页面的主机名确定SSO服务的主机地址
  const hostStr = window.location.host.includes('58v5.cn')
    ? 'passport-cloud.58v5.cn'
    : 'passport.58corp.com'

  // 清除当前会话
  clearSession()

  // 返回一个拼接的URL字符串，包含主机名、SSO类型和当前页面的原始URL编码后的服务参数
  return `https://${hostStr}/${SSOtype}?service=` + encodeURIComponent(window.location.origin)
}

/**
 * 时间格式转换函数
 *
 * @param dateTime 输入的时间值，可以是Date对象、时间戳或字符串格式
 * @param type 输出时间格式类型，可选值为 'yyyy-MM-DD' 或 'MM-DD'，默认为 'yyyy-MM-DD'
 * @returns 格式化后的时间字符串
 */
export function timetrans(dateTime: any, type: string) {
  const date = new Date(dateTime)
  var Y = date.getFullYear() + '-'
  var M = (date.getMonth() + 1 < 10 ? '0' + (date.getMonth() + 1) : date.getMonth() + 1) + '-'
  var D = (date.getDate() < 10 ? '0' + date.getDate() : date.getDate()) + ''
  var h = (date.getHours() < 10 ? '0' + date.getHours() : date.getHours()) + ':'
  var m = (date.getMinutes() < 10 ? '0' + date.getMinutes() : date.getMinutes()) + ':'
  var s = date.getSeconds() < 10 ? '0' + date.getSeconds() : date.getSeconds()
  if (type == 'yyyy-MM-DD') {
    return Y + M + D
  } else {
    return M + D
  }
}

/**
 * 生成一个指定长度的UUID
 *
 * @param length UUID的长度，默认为8
 * @returns 返回生成的UUID字符串
 */
export function uuid(length = 8) {
  const s: any[] = []
  const hexDigits = '0123456789abcdef'
  for (let i = 0; i < 36; i++) {
    s[i] = hexDigits.substr(Math.floor(Math.random() * 0x10), 1)
  }
  s[14] = '4' // bits 12-15 of the time_hi_and_version field to 0010
  s[19] = hexDigits.substr((s[19] & 0x3) | 0x8, 1) // bits 6-7 of the clock_seq_hi_and_reserved to 01
  s[8] = s[13] = s[18] = s[23] = ''

  const uuid = s.join('')
  return uuid.slice(0, length)
}
